#include <iostream>
#include <bits/ostream.tcc>
//
// Created by Asus on 2025/5/31.
//
using namespace std;

// 全局变量
int g_a = 10;
int g_b = 20;

// 全局常量
const int c_g_a = 10;
const int c_g_b = 20;

typedef unsigned long long uint_64;

void demo01() {
    // 局部变量
    int a = 10;
    int b = 20;

    //打印地址
    cout << "局部变量a地址为： " << &a << endl;
    cout << "局部变量a地址为： " << reinterpret_cast<unsigned long long>(&a) << endl;
    cout << "局部变量a地址为： " << (uint_64) (&a) << endl;
    cout << "局部变量b地址为： " << &b << endl;
    cout << "局部变量b地址为： " << reinterpret_cast<unsigned long long>(&b) << endl;

    cout << "全局变量g_a地址为： " << (uint_64) &g_a << endl;
    cout << "全局变量g_a地址为： " << &g_a << endl;
    cout << "全局变量g_b地址为： " << (uint_64) &g_b << endl;

    //静态变量
    static int s_a = 10;
    static int s_b = 10;

    cout << "静态变量s_a地址为： " << (uint_64) &s_a << endl;
    cout << "静态变量s_a地址为： " << &s_a << endl;
    cout << "静态变量s_b地址为： " << (uint_64) &s_b << endl;

    cout << "字符串常量地址为： " << (uint_64) &"hello world" << endl;
    cout << "字符串常量地址为： " << &"hello world" << endl;
    cout << "字符串常量地址为： " << (uint_64) &"hello world1" << endl;

    cout << "全局常量c_g_a地址为： " << (uint_64) &c_g_a << endl;
    cout << "全局常量c_g_a地址为： " << &c_g_a << endl;
    cout << "全局常量c_g_b地址为： " << (uint_64) &c_g_b << endl;

    const int c_l_a = 10;
    const int c_l_b = 10;
    cout << "局部常量c_l_a地址为： " << (uint_64) &c_l_a << endl;
    cout << "局部常量c_l_a地址为： " << &c_l_a << endl;
    cout << "局部常量c_l_b地址为： " << (uint_64) &c_l_b << endl;
}

int *func() {
    int a = 10;
    return &a;
}

int* func2()
{
    int* a = new int(10);
    return a;
}

void demo02() {
    // 由编译器自动分配释放, 存放函数的参数值,局部变量等 注意事项：不要返回局部变量的地址，栈区开辟的数据由编译器自动释放
    int *p = func();
    int *p2 = func2();
    // cout << "p* = " << *p << endl; // SIGSEGV 报错
    // 堆区数据由程序员管理开辟和释放
    // 堆区数据利用new关键字进行开辟内存
    cout << "p2* = " << *p2 << endl;
}

void demo03() {
    int *a = func2();
    cout << "a = " << *a << endl;
    delete a;
    // cout << "a = " << *a << endl;
}

void demo04() {
    int *arr = new int[10];
    for (int i = 0; i < 10; i++) {
        arr[i] = i;
    }
    for (int i = 0; i < 10; i++) {
        cout << arr[i] << endl;
    }
    delete[] arr;
}

int main() {
    // demo01();
    // demo02();
    // demo03();
    demo04();
    return 0;
}
